package cn.itcast.zt.java8.model.decorator.demo2;

import cn.hutool.core.annotation.AnnotationUtil;
import cn.hutool.core.util.StrUtil;
import org.springframework.core.annotation.AnnotationUtils;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 装饰管理器
 * 内部维护一个map，负责存放具体的装饰器类
 * @author zhangtian105
 * @date 2023/4/20
 * @apiNote
 */
public class DecorateManager {
    /**
     * 用于存放装饰器类
     */
    private Map<String, AbstractHandler> decorateHandlerMap = new HashMap<>() ;

    /**
     * 可以结合Spring的特性，将装饰器类注入到该方法内
     * 将具体装饰器类放入map中
     * @param handlerList
     */
    public void setDecorateHandler(List<AbstractHandler> handlerList) {
        for (AbstractHandler abstractHandler : handlerList) {
            Decorate annotation = AnnotationUtils.findAnnotation(abstractHandler.getClass(), Decorate.class) ;
            decorateHandlerMap.put(createKey(annotation.scene(), annotation.type()), abstractHandler) ;
        }
    }

    /**
     * 返回具体的装饰器类
     * @param scene
     * @param type
     * @return
     */
    public AbstractHandler selectHandler(String scene, String type) {
        String key = createKey(scene, type) ;
        return decorateHandlerMap.get(key) ;
    }

    /**
     * 拼接map的key
     * @param scene
     * @param type
     * @return
     */
    private String createKey(String scene, String type) {
        return StrUtil.builder().append(scene).append(":").append(type).toString();
    }
}
